package com.yjpark.apps.netcalc;


import java.net.Socket;

import com.yjpark.protocols.HashUtil;
import com.yjpark.protocols.UserApplication;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class LoginActivity extends Activity {
    /** Called when the activity is first created. */
    
    // macbook-VMWare
//    private final static String IP = "192.168.0.15";
//    private final static int Port = 9900;

    // sslab-VMWare
//    private final static String IP = "192.168.10.128";
//    private final static int Port = 9900;
    
    // vaio
  private final static String IP = "192.168.1.11";
  private final static int Port = 9900;
    
    static String id = "";
    static String passwd = "";
    static String loginSession = "";
    static String mode = "";

    Socket socket = null;
    
    private Handler handler = new Handler(); //
    private CalculateNetwork CalculateNetwork;
    
    private final static String GREETING_MSG = "Input User ID and Password.\n";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login_layout);
        
    }
    
    public void onClickLogin(View view) {
    	final Intent intent = new Intent(LoginActivity.this, CalculateActivity.class);

    	EditText idEdit = (EditText)findViewById(R.id.editText1);
    	EditText passwdEdit = (EditText) findViewById(R.id.editText2);
    	
    	id = idEdit.getText().toString();
    	passwd = passwdEdit.getText().toString();
    	mode = "INIT";
	
    	if(id.equals("") || passwd.equals("")) {
    		// ID 또는 비밀번호 입력이 없는 경우
            // toast 띄우기
            Toast.makeText(LoginActivity.this, "Please check User ID and Password", Toast.LENGTH_SHORT).show();
            return;
    	}
    	
        handler = new Handler() {
            public void handleMessage(Message msg) {
                String message = (String) msg.obj;
                String[] packetStr = message.split(":");
                String msgType = packetStr[0];
                String msgData = packetStr[1];
                
                // greeting message
                if(msgType.equals("M_HELLO") && msgData.equals(GREETING_MSG) && mode.equals("INIT")) {
                	// 정상 접속인 경우 ID & Password를 전송해서 로그인 요청한다
                    CalculateNetwork.write(id+"|"+passwd, "M_LOGINREQ");
                    CalculateNetwork.read();
                    
                    mode = "GREETING";
                    
                } else if(msgType.equals("M_LOGINRES") && msgData.equals(id+"|"+passwd+"\n") && mode.equals("GREETING")) { // 수정예정, 보안 문제
                    // 입력값 초기화
                    EditText idEdit = (EditText)findViewById(R.id.editText1);
                    EditText passwdEdit = (EditText) findViewById(R.id.editText2);
                    idEdit.setText("");
                    passwdEdit.setText("");
                    
                	// 로그인 성공
                	mode = "LOGINED";
                	
                	// 세션값 생성
                	loginSession = HashUtil.encodeString(id+":"+passwd);
                
                	// 로그인 세션 적용
                	intent.putExtra("LOGIN_SESSION", loginSession);
                    intent.putExtra("LOGIN_ID", id);
                    
                    // application 변수 저장
                    UserApplication.setId(id);
                    UserApplication.setPasswd(passwd);
                    
                    UserApplication.setCalculateNetwork(CalculateNetwork);
                    UserApplication.setSocket(CalculateNetwork.getSocket());
                    
                    
                    // activity stack clear
//                    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
                    
                    startActivity(intent);
                    
                } else {
                	// 로그인 실패
                    // toast 띄우기
                    Toast.makeText(LoginActivity.this, "Login failed! Please check User ID and Password", Toast.LENGTH_SHORT).show();
                    return;
                }
            }
        };
    	
        // 서버 접속
        CalculateNetwork = new CalculateNetwork(handler, IP, Port);
        CalculateNetwork.start();
        
    }
    
    public void onClickJoin(View view) {
    	Intent intent = new Intent(LoginActivity.this, JoinActivity.class);
    	
    	startActivity(intent);
    }
    
    // ========================================== //
    // back key double click
    // Back의 상태값을 저장하기 위한 변수
    boolean m_close_flag = false;

    // 일정 시간 후 상태값을 초기화하기 위한 핸들러
    Handler m_close_handler = new Handler() {
        public void handleMessage(Message msg) {
            m_close_flag = false;
        }
    };

	// Back 키가 터치되면 호출되는 메소드
	public void onBackPressed() {
		// m_close_flag 가 false 이면 첫번째로 키가 눌린 것이다.
		if (m_close_flag == false) { // Back 키가 첫번째로 눌린 경우

			// 안내 메세지를 토스트로 출력한다.
			Toast.makeText(this, "취소키를 한번 더 누르시면 종료됩니다.", Toast.LENGTH_LONG).show();

			// 상태값 변경
			m_close_flag = true;

			// 핸들러를 이용하여 3초 후에 0번 메세지를 전송하도록 설정한다.
			m_close_handler.sendEmptyMessageDelayed(0, 3000);

		} else { // Back 키가 3초 내에 연달아서 두번 눌린 경우
            
			// 액티비티를 종료하는 상위 클래스의 onBackPressed 메소드를 호출한다.
			super.onBackPressed();
		}
	}

	protected void onStop() {
		super.onStop();

		// 핸드러에 등록된 0번 메세지를 모두 지운다.
		this.m_close_handler.removeMessages(0);
	}
    // ========================================== //
    

}